# encoding: utf-8
# @File  : dingding_rebot.py
# @Author: wu shaofan
# @Date  :  2024/04/15
# @Desc :把钩子函数收集到的测试结果发送到钉钉群
import base64
import hashlib
import hmac
import time
import urllib.parse
import requests


def generate_sign():
    '''
    生存签名计算
    :return:
    '''
    # 获取当前时间的时间戳
    current_time = str(round(time.time() * 1000))
    # 获取钉钉机器人的加签密钥
    secret = "SEC3396bfde03c0ce0c037c3ef5eabe1a213224ef31cb6769e774d30804ae35c23c"
    # 转码成utf-8
    secret_enc = secret.encode('utf-8')
    # 组合当前时间戳和加签密钥
    sign_str = f"{current_time}\n{secret}"
    # 转成byte类型
    sign_str_byte = sign_str.encode('utf-8')
    # 通过加密方式加密当前时间戳和密钥
    hmac_code = hmac.new(secret_enc, sign_str_byte, hashlib.sha256).digest()
    sign = urllib.parse.quote_plus(base64.b64encode(hmac_code))


    # 返回当前时间戳和签名
    return current_time,sign


def send_ding_msg(content,at_all=True):
    """
    发送钉钉消息
    :param content: 表示要发送的消息内容，可以是文本、链接等信息。
    :param at_all: 表示是否需要@所有人，默认为 True，即@所有人；如果设置为 False，则不@任何人。
    :return:
    """

    # 获取当前时间的时间戳和签名
    current_time,sign = generate_sign()
    # 组成一个完整的地址  复制webhook地址
    url = f"https://oapi.dingtalk.com/robot/send?access_token=eaaec0eb73d81bededf5b497ae233b4448df4d32b4a8df01febf48f2ef8d0491&timestamp={current_time}&sign={sign}"
    headers = {"Content-Type": "application/json;charset=utf-8"}
    data = {
        "msgtype": "text",
        "text": {
            "content": content
        },
        "at": {
            "isAtAll": at_all
        }
    }
    # 发起请求
    response = requests.post(url, headers=headers, json=data)
    return response.text

# 测试发消息
if __name__ == '__main__':
    content = "测试消息"
    send_ding_msg(content)